/**
 * 处理响应数据模块
 * @param {*} data 响应数据
 * @param {*} dealType 响应数据处理对象 
 * @param {*} dom 事件源
 */
function dealData(data, dealType, dom) {
  // 简化处理，获取数据类型
  data = Object.prototype.toString.call(data)
  switch (dealType) {
    case 'sug':
      // 数组类型数据
      if (data === '[object Array]') {
        return createSug(data, dom)
      }
      if (data === '[object Object]') {
        return createSug(data, dom)
      }
      return createSug([data], dom)
      break;
    case 'validate':
      return createValidateResult(data, dom)
      break;
    default:
      break;
  }
}

/**
 * 创建提示建议组件模块
 * @param {*} data 
 * @param {*} dom 
 */
function createSug(data, dom) {
  var html = ''
  for (var i = 0, len = data.length; i < len; i++) {
    html += '<li>' + data[i] + '</li>'
  }
  dom.parentNode.getElementsByTagName('ul')[0].innerHTML = html
}

/**
 * 创建校验数据组件模块
 * @param {*} data 
 * @param {*} dom 
 */
function createValidateResult(data, dom) {
  dom.parentNode.getElementsByTagName('span')[0].innerHTML = data
}

// 单元测试
var input = document.getElementsByName('input')
dealData('用户名不正确', 'validate', input[0])
dealData(['java', 'html', 'css'], 'sug', input[1])

// 备忘录模式——缓存
// 下一页
$('#next_page').click(function () {
  // 新闻内容选择器对象
  var $news = $('#news_contents')
  // 当前页数
  var page = $news.data('page')
  // 获取数据方法
  getPageData(page, function () {
    $news.data('page', page + 1)
  })
})
// 上一页
$('#prev_page').click(function () {
  //
})

/**
 * 获取数据
 * @param {*} page 页数
 * @param {*} fn 回调函数
 */
var getPageData = function (page, fn) {
  $.post('data/getNewsData.php', {
    page: page
  }, function (res) {
    // 正常数据
    if (res.errNo == 0) {
      // 显示页面内容
      showPage(page, res.dta)
      fn && fn()
    } else {
      // 处理异常
    }
  })
}

// 页面渲染逻辑
var showPage = function (page, data) {
  // 渲染页面内容
}

// 缓存构造函数
var Page = function () {
  // 数据缓存对象
  var cache = {}

  return function (page, fn) {
    if (cache[page]) {
      showPage(page, cache[page])
      fn && fn()
    } else {
      $.post('data/getNewsData.php', {
        page: page
      }, function (res) {
        // 正常数据
        if (res.errNo == 0) {
          showPage(page, res.dta)
          cache[page] = res.data
          fn && fn()
        } else {
          // 处理异常
        }
      })
    }
  }
}

$('#next_page').click(function() {
  var $news = $('#news_contents')
  var page = $news.data('page')
  Page(page, function() {
    $news.data('page', page + 1)
  })
})

var eachArray = function(arr, fn) {
  if(Object.prototype.toString.call(arr) !== '[object Array]') {
    throw TypeError(arr + 'is not a array')
  }
  for(var i = 0, len = arr.length; i < len; i++) {
    // 有点不明白为什么要这样判断，其中一个元素迭代出错就终止？
    // call 改变 this指向遍历中的元素，第一个参数是索引，第二个参数是元素值
    if(fn.call(arr[i], i, arr[i]) === false) {
      break;
    }
  }
}

function createIterator(items) {
  var i = 0
  
  return {
    next: function() {
      var done = (i >= items.length)
      var value = !done ? items[i++] : undefined
      
      return {
        done: done,
        value: value
      }
    }
  }
}

var iterator = createIterator([1,2,3])

console.log(iterator.next())  
console.log(iterator.next())
console.log(iterator.next())
// 之后所有调用都会返回相同的内容
console.log(iterator.next())